Spring Boot 与 Kotlin 教程
1. Kotlin 简介和特性
Kotlin 是一种静态类型的编程语言,运行在 Java 虚拟机(JVM)上,并且可以编译成 JavaScript 源代码。Kotlin 由 JetBrains 开发,旨在提高开发效率和代码可读性。Kotlin 的主要特性包括:
- 简洁性:减少样板代码,提高代码可读性。
- 空安全:通过类型系统防止空指针异常。
- 互操作性:与 Java 完全兼容,可以无缝调用 Java 代码。
- 函数式编程:支持高阶函数、Lambda 表达式等。
2. 开发环境搭建
2.1 IntelliJ IDEA
IntelliJ IDEA 是 JetBrains 开发的一款强大的 IDE,特别适合 Kotlin 开发。以下是安装步骤:
- 下载并安装 IntelliJ IDEA。
- 打开 IntelliJ IDEA,选择 "New Project"。
- 选择 "Kotlin" 作为项目类型,并选择 "JVM" 作为目标平台。
- 配置项目名称和位置,点击 "Finish" 完成创建。
2.2 Android Studio
Android Studio 是 Google 官方推荐的 Android 开发 IDE,基于 IntelliJ IDEA 构建,同样支持 Kotlin。
- 下载并安装 Android Studio。
- 打开 Android Studio,选择 "New Project"。
- 选择 "Empty Activity" 模板,并选择 Kotlin 作为编程语言。
- 配置项目名称和位置,点击 "Finish" 完成创建。
3. 第一个 Kotlin 程序
创建一个简单的 Kotlin 程序,输出 "Hello, World!"。
fun main() {
println("Hello, World!")
}
4. 基本语法和数据类型
4.1 变量和常量
- 变量:使用
var关键字声明,可以重新赋值。 - 常量:使用
val关键字声明,不可重新赋值。
var age: Int = 25
val name: String = "Alice"
4.2 数据类型
Kotlin 支持多种基本数据类型,包括:
- 数字类型:
Int,Long,Float,Double - 字符类型:
Char - 布尔类型:
Boolean - 字符串类型:
String
val number: Int = 10
val letter: Char = 'A'
val isTrue: Boolean = true
val text: String = "Hello"
5. 条件语句
5.1 if 语句
val a = 10
val b = 20
if (a > b) {
println("a is greater than b")
} else {
println("b is greater than a")
}
5.2 when 语句
when 语句类似于 Java 中的 switch 语句,但功能更强大。
val day = 3
when (day) {
1 -> println("Monday")
2 -> println("Tuesday")
3 -> println("Wednesday")
else -> println("Other day")
}
6. 循环
6.1 for 循环
for (i in 1..5) {
println(i)
}
6.2 while 循环
var i = 1
while (i <= 5) {
println(i)
i++
}
6.3 do-while 循环
var i = 1
do {
println(i)
i++
} while (i <= 5)
7. 跳转表达式
7.1 break
用于跳出循环。
for (i in 1..10) {
if (i == 5) {
break
}
println(i)
}
7.2 continue
用于跳过当前循环的剩余部分,继续下一次循环。
for (i in 1..5) {
if (i == 3) {
continue
}
println(i)
}
7.3 return
用于从函数中返回值。
fun add(a: Int, b: Int): Int {
return a + b
}
8. 函数定义和调用
8.1 函数定义
fun greet(name: String): String {
return "Hello, $name!"
}
8.2 函数调用
val message = greet("Alice")
println(message)
9. 默认参数和命名参数
9.1 默认参数
fun greet(name: String = "Guest"): String {
return "Hello, $name!"
}
9.2 命名参数
val message = greet(name = "Bob")
println(message)
10. 单表达式函数
fun add(a: Int, b: Int) = a + b
11. Lambda 表达式
val sum = { x: Int, y: Int -> x + y }
println(sum(1, 2))
12. 高阶函数
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
val result = operate(3, 4) { x, y -> x * y }
println(result)
13. 类定义和实例化
13.1 类定义
class Person(val name: String, var age: Int)
13.2 实例化
val person = Person("Alice", 25)
println("Name: ${person.name}, Age: ${person.age}")
14. 构造函数和初始化块
14.1 主构造函数
class Person(val name: String, var age: Int) {
init {
println("Person created with name: $name and age: $age")
}
}
14.2 次构造函数
class Person(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
}
15. 属性和字段
class Person(val name: String, var age: Int) {
var address: String = ""
get() = field
set(value) {
field = value
}
}
16. 继承和接口
16.1 继承
open class Animal(val name: String)
class Dog(name: String) : Animal(name)
16.2 接口
interface Greeter {
fun greet(name: String): String
}
class Person(val name: String) : Greeter {
override fun greet(name: String): String {
return "Hello, $name!"
}
}
17. 数据类和密封类
17.1 数据类
data class User(val id: Int, val name: String)
val user = User(1, "Alice")
println(user)
17.2 密封类
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
fun processResult(result: Result) {
when (result) {
is Success -> println("Success: ${result.data}")
is Error -> println("Error: ${result.message}")
}
}
18. 对象声明和表达式
18.1 对象声明
object Singleton {
val name = "Singleton"
}
println(Singleton.name)
18.2 对象表达式
val greeter = object : Greeter {
override fun greet(name: String): String {
return "Hello, $name!"
}
}
println(greeter.greet("Alice"))
19. 可空类型和非空类型
19.1 可空类型
var name: String? = null
19.2 非空类型
var name: String = "Alice"
20. 安全调用操作符 (?.)
val name: String? = null
println(name?.length)
21. Elvis 操作符 (?:)
val name: String? = null
val length = name?.length ?: 0
println(length)
22. 非空断言 (!!)
val name: String? = "Alice"
println(name!!.length)
23. 平台类型
val name: String! = "Alice"
println(name.length)
24. List, Set, Map
24.1 List
val list = listOf("Apple", "Banana", "Cherry")
println(list)
24.2 Set
val set = setOf("Apple", "Banana", "Cherry")
println(set)
24.3 Map
val map = mapOf("Apple" to 1, "Banana" to 2, "Cherry" to 3)
println(map)
25. 可变集合和不可变集合
25.1 可变集合
val mutableList = mutableListOf("Apple", "Banana", "Cherry")
mutableList.add("Date")
println(mutableList)
25.2 不可变集合
val immutableList = listOf("Apple", "Banana", "Cherry")
// immutableList.add("Date") // 编译错误
println(immutableList)
26. 集合操作 (filter, map, reduce 等)
26.1 filter
val list = listOf(1, 2, 3, 4, 5)
val filteredList = list.filter { it % 2 == 0 }
println(filteredList)
26.2 map
val list = listOf(1, 2, 3, 4, 5)
val mappedList = list.map { it * 2 }
println(mappedList)
26.3 reduce
val list = listOf(1, 2, 3, 4, 5)
val sum = list.reduce { acc, i -> acc + i }
println(sum)
27. 序列 (Sequence)
val sequence = sequenceOf(1, 2, 3, 4, 5)
val result = sequence.filter { it % 2 == 0 }.map { it * 2 }.toList()
println(result)
28. 不可变性
val immutableList = listOf("Apple", "Banana", "Cherry")
// immutableList.add("Date") // 编译错误
println(immutableList)
29. 纯函数
fun add(a: Int, b: Int): Int {
return a + b
}
30. 函数组合
fun compose(f: (Int) -> Int, g: (Int) -> Int): (Int) -> Int {
return { x -> f(g(x)) }
}
val addOne = { x: Int -> x + 1 }
val double = { x: Int -> x * 2 }
val composed = compose(addOne, double)
println(composed(5))
31. 柯里化
fun add(a: Int) = { b: Int -> a + b }
val addFive = add(5)
println(addFive(10))
32. 协程基础
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello,")
}
33. 挂起函数
import kotlinx.coroutines.*
suspend fun doSomething() {
delay(1000L)
println("Done")
}
fun main() = runBlocking {
doSomething()
}
34. 协程上下文和调度器
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Default) {
println("Running on ${Thread.currentThread().name}")
}
}
35. 通道和流
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
for (x in 1..5) channel.send(x * x)
channel.close()
}
for (y in channel) println(y)
}
36. 异步编程模式
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferred = async {
delay(1000L)
42
}
println("The answer is ${deferred.await()}")
}
37. 泛型函数和类
37.1 泛型函数
fun <T> printList(list: List<T>) {
for (item in list) {
println(item)
}
}
val list = listOf(1, 2, 3)
printList(list)
37.2 泛型类
class Box<T>(val item: T)
val box = Box("Hello")
println(box.item)
38. 型变(协变和逆变)
38.1 协变
interface Producer<out T> {
fun produce(): T
}
class ProducerImpl : Producer<String> {
override fun produce(): String {
return "Hello"
}
}
val producer: Producer<Any> = ProducerImpl()
println(producer.produce())
38.2 逆变
interface Consumer<in T> {
fun consume(item: T)
}
class ConsumerImpl : Consumer<String> {
override fun consume(item: String) {
println(item)
}
}
val consumer: Consumer<Any> = ConsumerImpl()
consumer.consume("Hello")
39. 类型投影
fun copy(from: Array<out Any>, to: Array<Any>) {
assert(from.size == to.size)
for (i in from.indices)
to[i] = from[i]
}
val ints: Array<Int> = arrayOf(1, 2, 3)
val any = Array<Any>(3) { "" }
copy(ints, any)
println(any.toList())
40. 泛型约束
fun <T : Comparable<T>> max(a: T, b: T): T {
return if (a > b) a else b
}
println(max(1, 2))